/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlaufgabe3;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Random;

/**
 * Model nach MVC Pattern. Speichert eine beliebige Anzahl an Konten und verwaltet
 * In-/Output dieser. Benachrichtigt Views bei Veraenderung der Daten.
 * 
 * @author Adrian Cieluch
 * @version 1.0, 11/3/11
 */
public class AccountModel extends Observable {
    /**
     * Speichert Konten
     */
    private ArrayList<Account> accounts = new ArrayList<Account>();
    
    /**
     * Legt Konten an mit Kontonummer 527676(0-unendlich).
     * 
     * @param quantity Anzahl an Konten die angelegt werden sollen.
     */
    public AccountModel(int quantity) {
        Random r = new Random();
        
        for(int i = 0; i < quantity; i++) {
            accounts.add(new Account("527676" + Integer.toString(i), new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256))));
        }
    }
    
    /**
     * Gibt die Anzahl an Konten zurueck.
     * 
     * @return Anzahl an Konten
     */
    public int getAccountQuantity() {
        return accounts.size();
    }
    
    /**
     * Zahlt einen Betrag auf ein ueber ID gewaehltes Konto ein.
     * 
     * @param s ID des Kontos
     * @param amount Einzuzahlender Betrag
     */
    public void depositAccountByID(String s, double amount) {
        getAccountByID(s).deposit(amount);
        this.setChanged();
        this.notifyObservers(new Transaction(s, "deposit", amount));
    }
    
    /**
     * Zahlt einen Betrag auf ein ueber ID gewaehltes Konto aus.
     * 
     * @param s ID des Kontos
     * @param amount Auszuzahlender Betrag
     */
    public void withdrawAccountByID(String s, double amount) {
        getAccountByID(s).withdraw(amount);
        this.setChanged();
        this.notifyObservers(new Transaction(s, "withdrawal", amount));
    }
    
    /**
     * Gibt den Kontostand eines durch ID gewaehlten Kontos zurueck.
     * 
     * @param s ID des Kontos
     * @return Kontostand
     */
    public double getAccountBalanceByID(String s) {
        return getAccountByID(s).getBalance();
    }
    
    /**
     * Gibt den Kontostand eines durch Index gewaehlten Kontos zurueck.
     * 
     * @param i Index
     * @return Kontostand
     */
    public double getAccountBalanceByIndex(int i) {
        return accounts.get(i).getBalance();
    }
    
    /**
     * Gibt die ID eines durch Index gewaehlten Kontos zurueck.
     * 
     * @param i Index
     * @return ID des Kontos
     */
    public String getAccountIdByIndex(int i) {
        return accounts.get(i).getID();
    }
    
    /**
     * Gibt die Farbe eines durch ID gewaehlten Kontos zurueck.
     * 
     * @param s ID des Kontos
     * @return Farbe des Kontos
     */
    public Color getColorByID(String s) {
        return getAccountByID(s).getColor();
    }
    
    /**
     * Gibt die Farbe eines durch Index gewaehlten Kontos zurueck.
     * 
     * @param i Index
     * @return Farbe des Kontos
     */
    public Color getColorByIndex(int i) {
        return accounts.get(i).getColor();
    }
    
    /**
     * Gibt ein durch die ID gewaehltes Konto zurueck.
     * 
     * @param s ID des Kontos
     * @return Konto
     */
    private Account getAccountByID(String s) {
        Account a = null;
        
        for(int i = 0; i < accounts.size(); i++) {
            if(s.equals(accounts.get(i).getID())) {
                a = accounts.get(i);
            }
        }
        
        return a;
    }
}
